/**
 * @file main.cpp
 * @brief HTTP代理服务器的主程序
 *
 * 本文件包含程序的入口点，负责处理命令行参数、设置信号处理器，
 * 以及创建并启动HTTP代理服务器实例。
 */

#include "HttpProxy.hpp"
#include <iostream>
#include <csignal>
#include <cstdlib>
#include <unistd.h>

// 全局代理实例指针，用于信号处理器中访问
HttpProxy *proxy = nullptr;

/**
 * @brief 打印程序使用说明
 * @param programName 程序名称
 */
void printUsage(const char *programName)
{
    std::cout << "用法: " << programName << " <端口>" << std::endl;
    std::cout << "  端口: 代理服务器监听的端口号 (1024-65535)" << std::endl;
}

/**
 * @brief 程序入口点
 * @param argc 命令行参数数量
 * @param argv 命令行参数数组
 * @return 程序退出状态码
 */
int main(int argc, char *argv[])
{
    // 检查命令行参数数量
    if (argc != 2)
    {
        printUsage(argv[0]);
        return 1;
    }

    // 解析端口号参数
    int port;
    try
    {
        port = std::stoi(argv[1]);
        // 检查端口号范围 (1024-65535是非特权端口)
        if (port < 1024 || port > 65535)
        {
            std::cerr << "错误: 端口必须在1024和65535之间" << std::endl;
            return 1;
        }
    }
    catch (const std::exception &e)
    {
        std::cerr << "错误: 无效的端口号" << std::endl;
        return 1;
    }

    // 创建并启动代理服务器
    proxy = new HttpProxy(port);
    if (!proxy->start())
    {
        std::cerr << "启动HTTP代理服务器失败" << std::endl;
        delete proxy;
        return 1;
    }

    // 注意：由于代理服务器的start()方法包含主事件循环，
    // 如果程序正常执行，main()函数不会到达这里。
    // 只有在代理服务器停止后（比如通过信号处理程序）才会继续执行。

    // 清理资源
    if (proxy)
    {
        delete proxy;
        proxy = nullptr;
    }

    return 0;
}